package thread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadSynchronized {
    public static void main(String[] args) {
        ThreadTrain threadTrain = new ThreadTrain();
        Thread thread1 = new Thread(threadTrain, "售票窗口1");
        Thread thread2 = new Thread(threadTrain, "售票窗口2");
        Thread thread3 = new Thread(threadTrain, "售票窗口3");
        thread1.start();
        thread2.start();
        thread3.start();
    }
}
class ThreadTrain implements Runnable{
    //10张
    private int trainCount = 10;

    @Override
    public void run() {
        while (true){

            try {
                Thread.sleep(200);   //模拟处理时间 放大线程安全问题
                sale();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
//    多线程三大特性        属于jvm同步   和高并发、分布式锁没关系
//    原子性：即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断，要么都不执行。
//    可见性：当多个线程访问一个变量时，一个线程修改了这个变量的值，其他线程能够立即看得到修改的值。
//    有序性：程序执行的顺序按照代码先后顺序执行。
    public  synchronized void sale(){    //出现超卖，因为2个线程同时进入了1个方法
        if(trainCount > 0){
            System.out.println(Thread.currentThread().getName()+"出售一张票,剩余"+--trainCount+"张票");
        }
    }
}